package lanQiaoBei.搜索与图论.dfs;
import java.io.*;
import java.math.*;
import java.util.*;
/*树的重心
* 题目描述
给定一颗树，树中包含 n 个结点（编号 1∼n）和 n−1条无向边。

请你找到树的重心，并输出将重心删除后，剩余各个连通块中点数的最大值。

重心定义：重心是指树中的一个结点，如果将这个点删除后，剩余各个连通块中点数的最大值最小，那么这个节点被称为树的重心。

输入格式

第一行包含整数 n，表示树的结点数。

接下来 n−1行，每行包含两个整数 a 和 b，表示点 a 和点 b之间存在一条边。

输出格式

输出一个整数 m

，表示将重心删除后，剩余各个连通块中点数的最大值。

数据范围

1≤n≤10^5

输入样例

9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6
输出样例：

4
* */
public class P4 {
       static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
       final static int N=100010,M=2*N;
       static int h[]=new int[N],e[]=new int[M],ne[]=new int[M],idx,n,res=0x3f3f3f3f;
       static boolean issearch[]=new boolean[N];
       static void add(int a,int b){
    	      e[idx]=b;ne[idx]=h[a];h[a]=idx++;
       }
       static int dfs(int node){
    	      issearch[node]=true;
    	      int sum=1,max=0;
    	      for(int i=h[node];i!=-1;i=ne[i]){
    	    	  int j=e[i];
    	    	  if(!issearch[j]){
    	    		  int t=dfs(j);
    	    		  max=Math.max(max, t);
    	    		  sum+=t;
    	    	  }
    	      }
    	      res=Math.min(res,Math.max(max,n-sum));
    	      return sum;
       }
       public static void main(String[] ss) throws IOException {
		      n=Integer.parseInt(br.readLine());
		      Arrays.fill(h,-1);
		      for(int i=1;i<=n-1;i++){
		    	  ss=br.readLine().split(" ");
		    	  int a=Integer.parseInt(ss[0]),b=Integer.parseInt(ss[1]);
		    	  add(a,b);		  
		    	  add(b,a);
		      }
		      dfs(1);
		      System.out.print(res);
	  }
}
